package com.huluobo.base.mvvm

import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.SPUtils
import com.huluobo.base.net.Res
import kotlinx.coroutines.launch
import java.lang.Exception
import java.lang.RuntimeException

/**
 *  Created by LC on 2024/8/15.
 */
open class BaseViewModel : ViewModel() {
    //所有错误信息的LiveData
    val onFailed by lazy { MutableLiveData<Throwable>() }

    fun executeNetRequest(
        s: suspend () -> Res, //suspend 挂起方法, () -> 代表当前参数是一个方法,见后后的值代表当前方法的返回值
        success: (String) -> Unit,//返回成功的方法,会直接调用成功LiveData的postValue
        failed: (Throwable) -> Unit = onFailed::postValue,//返回错误的方法,传的是个错误(异常)类型,默认值是直接把错误信息保存到onFailed的postValue中
        okCode: Int = 200//正确码,默认值是200
    ) {
        viewModelScope.launch {//协程发起一个异步线程
            try {
                val res = s.invoke()//调用s这个方法
                Log.i("TagA", "value:${res.values}")
                if (res.statuesCode.toInt() == okCode) {
                    //成功
                    success(res.values)
                } else {
                    //失败
                    failed(RuntimeException(res.msg))
                }
            } catch (e: Exception) {
                //如果网络请求发生异常,走这里
                failed(e)
            }
        }
    }
}